package v1

import (
	"RoccBlog/api"
	"RoccBlog/global"
	"RoccBlog/model"
	v1 "RoccBlog/service/v1"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
)

type GeneratorController struct {
	api.BaseController
	api.BaseOperationController
	Service *v1.GeneratorService
}

func (c *GeneratorController) RegisterController(engine *gin.RouterGroup) {
	c.Service = global.GetService(v1.GeneratorService{}).(*v1.GeneratorService)
	g := engine.Group("/generator")
	{
		g.POST("", c.Add)
		g.DELETE("", c.Remove)
		g.PUT("", c.Modify)
		g.GET("/list", c.Find)
		g.GET("", c.FindById)
		g.PUT("/columns", c.ModifyGeneratorTableColumns)
		g.GET("/preview", c.PreviewGenerator)
		g.GET("/download", c.DownLoadGenerator)
	}
}
func init() {
	global.RegisterController(&GeneratorController{})
}

// Add
// @Tags 低代码生成
// @Summary 添加生成表
// @Produce  json
// @Param generatorTable body model.GeneratorTable false "生成表信息"
// @Success 200 {object} api.Result "成功"
// @Router /generator [post]
func (c *GeneratorController) Add(ctx *gin.Context) {
	var generatorTable model.GeneratorTable
	err := ctx.ShouldBind(&generatorTable)
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}

	err = c.Service.Add(ctx, generatorTable)
	c.HandleResponseNoResult(ctx, err, "添加生成表失败", "添加生成表成功")
}

// Remove
// @Tags 低代码生成
// @Summary 删除生成表
// @Produce  json
// @Param id query int required "生成表id"
// @Success 200 {object} api.Result "成功"
// @Router /generator [delete]
func (c *GeneratorController) Remove(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	err = c.Service.Remove(ctx, id)
	c.HandleResponseNoResult(ctx, err, "删除生成表失败", "删除生成表成功")
}

// Modify
// @Tags 低代码生成
// @Summary 修改生成表
// @Produce  json
// @Param generatorTable body model.GeneratorTable required "生成表信息"
// @Success 200 {object} api.Result "成功"
// @Router /generator [put]
func (c *GeneratorController) Modify(ctx *gin.Context) {
	var generatorTable model.GeneratorTable
	err := ctx.ShouldBind(&generatorTable)
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}

	err = c.Service.Modify(ctx, generatorTable)
	c.HandleResponseNoResult(ctx, err, "更新生成表失败", "更新生成表成功")
}

// ModifyGeneratorTableColumns
// @Tags 低代码生成
// @Summary 修改生成表字段信息
// @Produce  json
// @Param id query int required "生成表id"
// @Param generatorColumns body model.GeneratorColumn required "生成表字段信息"
// @Success 200 {object} api.Result "成功"
// @Router /generator/columns [put]
func (c *GeneratorController) ModifyGeneratorTableColumns(ctx *gin.Context) {

	//获取生成表id
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}

	//获取生成表信息
	var columns []model.GeneratorColumn
	err = ctx.ShouldBind(&columns)
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}

	err = c.Service.ModifyGeneratorColumns(ctx, id, columns)
	c.HandleResponseNoResult(ctx, err, "修改生成表字段信息失败", "修改生成表字段信息成功")
}

// Find
// @Tags 低代码生成
// @Summary 查找生成表列表
// @Produce  json
// @Param pageNum query int false "页码"
// @Param pageSize query int false "每页数量"
// @Success 200 {object} api.Result "成功"
// @Router /generator/list [get]
func (c *GeneratorController) Find(ctx *gin.Context) {
	pageInfo, err := c.Service.Find(ctx)
	c.HandleResponseResult(ctx, err, "获取生成表列表失败", pageInfo)
}

// FindById
// @Tags 低代码生成
// @Summary 查找生成表byId
// @Produce  json
// @Param id query int required "生成表id"
// @Success 200 {object} api.Result "成功"
// @Router /generator [get]
func (c *GeneratorController) FindById(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	generator, err := c.Service.FindById(ctx, id)
	c.HandleResponseResult(ctx, err, "查询生成表失败", generator)
}

// PreviewGenerator
// @Tags 低代码生成
// @Summary 预览代码生成结果
// @Produce  json
// @Param id query int required "生成表id"
// @Param model query string required "生成模式，空则单表，masterSub则是主子表，tree则为树表"
// @Param subTableId query string required "主子表/树表，第二章表的id"
// @Success 200 {object} api.Result "成功"
// @Router /preview [get]
func (c *GeneratorController) PreviewGenerator(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	rlt, err := c.Service.Preview(id, ctx)

	c.HandleResponseResult(ctx, err, "预览失败", rlt)
}

// DownLoadGenerator
// @Tags 低代码生成
// @Summary 预览代码生成结果
// @Produce  json
// @Param id query int required "生成表id"
// @Param model query string required "生成模式，空则单表，masterSub则是主子表，tree则为树表"
// @Param subTableId query string required "主子表/树表，第二章表的id"
// @Success 200 {object} api.Result "成功"
// @Router /download [get]
func (c *GeneratorController) DownLoadGenerator(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	err = c.Service.DownloadCode(ctx, id)
	if err != nil {
		c.Response(ctx, http.StatusInternalServerError, err.Error(), nil)
	}
}
